#include "app_msg.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "drv_sys.h"

/* 静态队列存储区（存储消息指针） */
static void* midi_queue_buf[MIDI_MSG_QUEUE_SIZE];
static void* uart_rx_queue_buf[UART_RX_MSG_QUEUE_SIZE];
static void* uart_tx_queue_buf[UART_PORT_COUNT][UART_TX_MSG_QUEUE_MAX_SIZE];

/* 队列实例定义 */
nst_msg_queue_t midi_queue;
nst_msg_queue_t uart_rx_queue;
nst_msg_queue_t uart_tx_queues[UART_PORT_COUNT];

/*--------------------------------------------------
 * 初始化所有消息队列
 *--------------------------------------------------*/
void app_msg_init(void) {
    /* 初始化MIDI消息队列 */
    nst_msg_init(&midi_queue, 
                "MIDI_QUEUE", 
                (uint8_t*)midi_queue_buf, 
                sizeof(void*),    // 队列元素是app_msg_t指针
                MIDI_MSG_QUEUE_SIZE);

    /* 初始化UART接收队列 */
    nst_msg_init(&uart_rx_queue, 
                "UART_RX_QUEUE", 
                (uint8_t*)uart_rx_queue_buf, 
                sizeof(void*), 
                UART_RX_MSG_QUEUE_SIZE);

    /* 初始化UART发送队列（每个端口一个） */
    for (uint8_t i = 0; i < UART_PORT_COUNT; i++) {
        char name[16];
        snprintf(name, sizeof(name), "UART%d_TX_QUEUE", i + 1);
        size_t queue_size;
        switch (i) {
            case 0:
                queue_size = UART_TX_MSG_QUEUE_SIZE_0;
                break;
            case 1:
                queue_size = UART_TX_MSG_QUEUE_SIZE_1;
                break;
            case 2:
                queue_size = UART_TX_MSG_QUEUE_SIZE_2;
                break;
            default:
                queue_size = 0;
                break;
        }
        nst_msg_init(&uart_tx_queues[i], 
                    name, 
                    (uint8_t*)uart_tx_queue_buf[i], 
                    sizeof(void*), 
                    queue_size);
    }
}

/*--------------------------------------------------
 * 变量长度消息入队（内存一次性分配）
 *--------------------------------------------------*/
bool app_msg_enqueue(nst_msg_queue_t *queue, uint8_t tp_value, const void *data, uint8_t len) {
    if (len > UART_MSG_DATA_MAX_LEN) {
        return false; // 数据长度超出最大限制
    }

    // 分配内存块：足够容纳app_msg_t结构体 + 数据
    size_t total_size = sizeof(app_msg_t) + len;
    __disable_irq();                     // 关闭所有中断
    app_msg_t *msg = (app_msg_t*)malloc(total_size);
    
    if (!msg) {
        return false;
    }

    // 初始化消息结构体
    msg->len = len;
    msg->tp.type = tp_value;
    msg->data = (uint8_t*)(msg + 1); // data指向结构体之后的空间
    memcpy(msg->data, data, len);

    // 将消息指针存入队列（关键修复：传递指针的地址）
    if (!nst_msg_enqueue(queue, &msg)) { // 修改此处，传递&msg
        free(msg); // 入队失败则释放内存
        return false;
    }
    __enable_irq();
    
    return true;
}

/*--------------------------------------------------
 * 变量长度消息出队
 *--------------------------------------------------*/
bool app_msg_dequeue(nst_msg_queue_t *queue, app_msg_t **msg) {
    void *msg_ptr = NULL;
    __disable_irq();
    if (!nst_msg_dequeue(queue, &msg_ptr)) {
        return false;
    }
    __enable_irq();
    *msg = (app_msg_t*)msg_ptr;
    return true;
}

/*--------------------------------------------------
 * 释放消息对象及其数据指针
 *--------------------------------------------------*/
void app_msg_free(app_msg_t *msg) {
    if (msg) {
        __disable_irq();
        free(msg); // 释放整个内存块（包含data部分）
        __enable_irq();
    }
}

/*--------------------------------------------------
 * 检查队列是否为空
 *--------------------------------------------------*/
bool app_msg_is_empty(nst_msg_queue_t *queue) {
    return nst_msg_is_empty(queue);
}

/*--------------------------------------------------
 * 检查队列是否已满
 *--------------------------------------------------*/
bool app_msg_is_full(nst_msg_queue_t *queue) {
    return nst_msg_is_full(queue);
}
